package com.example.demo.demos.util;

import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class FileUploadUtil {

    /**
     * 上传文件到指定目录，并检查bak目录及同名文件
     * @param file 待上传的文件
     * @param targetDir 目标目录路径
     * @return 包含上传结果和检查信息的字符串
     */
    public static String uploadFile(MultipartFile file, String targetDir) {
        // 检查目标目录是否存在，不存在则创建
        File directory = new File(targetDir);
        if (!directory.exists()) {
            boolean dirCreated = directory.mkdirs();
            if (!dirCreated) {
                return "创建目标目录失败: " + targetDir;
            }
        }

        // 获取文件名
        String fileName = file.getOriginalFilename();
        if (fileName == null || fileName.isEmpty()) {
            return "文件名不能为空";
        }

        // 构建目标文件路径
        Path targetPath = Paths.get(targetDir, fileName);

        try {
            // 保存文件到目标目录
            Files.write(targetPath, file.getBytes());

            // 检查bak目录及同名文件
            return checkBakDirectory(targetDir, fileName);

        } catch (IOException e) {
            return "文件上传失败: " + e.getMessage();
        }
    }

    /**
     * 检查目标目录下是否有bak目录及同名文件
     * @param targetDir 目标目录
     * @param fileName 文件名
     * @return 检查结果信息
     */
    private static String checkBakDirectory(String targetDir, String fileName) {
        // 构建bak目录路径
        File bakDir = new File(targetDir, "bak");

        // 检查bak目录是否存在
        if (!bakDir.exists() || !bakDir.isDirectory()) {
            return "文件上传成功，但未找到bak目录。文件名: " + fileName;
        }

        // 检查bak目录中是否有相同文件名的文件
        File bakFile = new File(bakDir, fileName);
        if (bakFile.exists() && bakFile.isFile()) {
            return "文件上传成功。bak目录中存在同名文件: " + fileName;
        } else {
            return "文件上传成功。bak目录存在，但未找到同名文件: " + fileName;
        }
    }

    /**
     * 文件是否存在
     * @param directoryPath
     * @param fileName
     * @return
     */
    public static boolean isFileExists(String directoryPath, String fileName) {
        // 校验参数
        if (directoryPath == null || fileName == null) {
            return false;
        }

        // 构建文件完整路径（目录 + 文件名）
        File directory = new File(directoryPath);
        File targetFile = new File(directory, fileName);

        // 检查：目录必须存在，且目标路径是文件且存在
        return directory.exists() && directory.isDirectory()
                && targetFile.exists() && targetFile.isFile();
    }

    /**
     * 逐字节比较两个文件是否完全相同
     * @param file1 第一个文件
     * @param file2 第二个文件
     * @return true：内容完全相同；false：内容不同或文件无效
     * @throws IOException 当文件无法读取时抛出
     */
    public static boolean isEqual(File file1, File file2) throws IOException {
        // 1. 基础校验：文件是否存在且为普通文件
        if (!isValidFile(file1) || !isValidFile(file2)) {
            return false;
        }

        // 2. 快速校验：文件大小不同直接返回false
        if (file1.length() != file2.length()) {
            return false;
        }

        // 3. 逐字节比对内容
        try (InputStream in1 = new FileInputStream(file1);
             InputStream in2 = new FileInputStream(file2)) {

            byte[] buffer1 = new byte[8192]; // 8KB缓冲区
            byte[] buffer2 = new byte[8192];
            int bytesRead;

            while ((bytesRead = in1.read(buffer1)) != -1) {
                // 读取第二个文件相同长度的字节
                int bytesRead2 = in2.read(buffer2);
                if (bytesRead != bytesRead2) {
                    return false; // 读取长度不一致（理论上因大小相同不会发生）
                }

                // 比较缓冲区内容
                for (int i = 0; i < bytesRead; i++) {
                    if (buffer1[i] != buffer2[i]) {
                        return false; // 发现不同字节
                    }
                }
            }
        }

        // 所有字节均相同
        return true;
    }

    /**
     * 校验文件是否为有效的普通文件
     */
    public static boolean isValidFile(File file) {
        return file != null && file.exists() && file.isFile();
    }

    public static void main(String[] args) {
        File file = new File("example.txt");

        String ext = "";
        int lastDot = file.getName().lastIndexOf('.');
        if (lastDot > 0 && lastDot < file.getName().length() - 1) {
            ext = file.getName().substring(lastDot + 1);
        }

        long size = file.length();

        System.out.println("扩展名: " + ext);
        System.out.println("大小: " + size + " bytes");
    }

    public static InputStream getFileStream(String filePath) throws Exception {
        File file = new File(filePath);
        return new FileInputStream(file);
    }
}
